#include <stdio.h> //标准输入输出流

void CopyFile(const char *destFile, const char *srcFile)
{
    FILE *fdest = fopen(destFile, "w");
    if (fdest == NULL)
    {
        return;
    }

    FILE *fsrc = fopen(srcFile, "r");
    if (fsrc == NULL)
    {
        return;
    }

    char c = 0;
    while ((c = fgetc(fsrc)) != EOF)
    {
        fputc(c, fdest);
    }

    fclose(fsrc);
    fclose(fdest);
}

struct Student
{
    int id;
    char name[32];
};

int main()
{
    // FILE 文件指针
    // fopen(文件名，文件类型):打开一个文件
    // 最小的权限打开
    // modes:模式
    // r 只读,文件不存在 打开失败
    // w 只写,文件不存在就创建, 如果存在就会删除从头写开始写入
    // a 追加写,文件不存在就创建

    // r+ 读写 w+ 读写 a+ 读写

    // FILE *f;
    // f = fopen("1.txt", "r");
    // if (f == NULL)
    // {
    //     printf("文件打开失败!\n");
    //     return -1;
    // }
    // printf("文件打开成功!\n");

    // // 读一个字符
    // char c = fgetc(f);
    // printf("%c\n", c);
    // char str = 0;

    //  // 继续读取并输出文件的其余字符
    // while ((c = fgetc(f)) != EOF)
    // {
    //     printf("%c", c);
    // }
    // printf("\n");
    // fclose(f); // 关闭文件指针(归还文件描述符)

    // CopyFile( "1.txt","IO编程");

#if 0
    FILE *f=fopen("1.txt", "w");
    if (f == NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }
    printf("文件打开成功!\n");

    // 读一个字符串,读到\n结束
    //  读取完后会默认在末尾添加\0,所以能读的字符数量是n-1

    char s[100] = {0};
    fgets(s, 100, f);
    printf("%s\n", s);
    fclose(f);
#endif

#if 0
    FILE *f = fopen("1.txt", "w");
    if (f == NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }
    printf("文件打开成功!\n");
    fputs("helloworld\n", f);
    fputs("hellofile", f);
    fclose(f);
#endif

#if 0
    FILE *f = fopen("1.txt", "r");
    if (f == NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }

    char s[1024]={0};
    fread(s,1024,1,f);
    printf("%s\n",s);

    fclose(f);
#endif

#if 0
    FILE *f = fopen("1.txt", "w");
    if (f == NULL)
    {
        printf("文件打开失败!\n");
        return -1;
    }

    struct Student s = {1, "zhangsan"};
    fwrite(&s, sizeof(s), 1, f);
    printf("%d %s\n", s.id, s.name);
    fclose(f);
#endif

// 格式化读写
#if 0
    FILE *f = fopen("1.txt", "a");               // 打开文件 "1.txt"，以写入模式（"w"）打开
    struct Student s = {3, "zhangsan"};          // 定义并初始化结构体变量 s
    fprintf(f, "id=%d name=%s\n", s.id, s.name); // 将结构体信息写入文件
    printf("id=%d name=%s\n", s.id, s.name);     // 在控制台打印结构体信息
    fclose(f);                                   // 关闭文件
#endif

// 随机读写
// 移动光标
#if 1
    FILE *f = fopen("1.txt", "r");
    char str[100] = {0};

    fseek(f, 0, SEEK_END); // 这两句可以计算文件的大小
    printf("%ld\n", ftell(f));

    rewind(f); // 将光标移动到文件开头

    // fread(str, 100, 1, f);
    // printf("%s\n", str);
    fclose(f);

#endif

    return 0;
}